# 分页功能的封装
class Pagination:
    """
        max_show：每页要显示的页码数
    """

    def __init__(self, request, data_len, max_show=11):
        try:
            page = int(request.GET.get("page", 1))  # 获取当前的页数,没有的话默认为1
            if page <= 0:  # 如果小于0或者是其他字母就默认为1
                page = 1
        except Exception:
            page = 1
        # print(page, type(page))

        qb = request.GET.copy() # 分页保留查询参数

        # 总的页码数 就是总页数除以每页的页码数 20/3 total_sum=6 more=2 more:就是余数
        total_sum, more = divmod(data_len, max_show)  # 就是总的页数50
        if more:  # 如果有余数
            total_sum += 1

        half_show = max_show // 2  # 中间的1-10 half_show就是5
        if total_sum <= max_show:  # 如果页码数没有11条
            # 页码的起始值
            page_start = 1
            # 页码的终止值
            page_end = total_sum
        else:
            # 处理左边的极值
            if page - half_show <= 0:  # 1-11
                page_start = 1
                page_end = max_show
            # 处理右边的极值
            elif page + half_show >= total_sum:  # max-11  max
                page_start = total_sum - max_show + 1
                page_end = total_sum
            # 保持在中间
            else:
                page_start = page - half_show
                page_end = page + half_show

        page_list = []
        page_list.append('<nav aria-label="Page navigation"><ul class="pagination">')
        if page == 1:  # 左边箭头
            page_list.append(
                '<li class="disabled"><span aria-hidden="true">&laquo;</span></li>')
        else:
            qb["page"] = page-1
            page_list.append(
                '<li><a href="?{}" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>'.format(
                    qb.urlencode()))

        for i in range(page_start, page_end + 1):  # 中间页码
            qb["page"] = i
            if i == page:  # 如果i等于当前页就添加一个颜色
                page_list.append('<li class="active"><a href="?{}">{}</a></li>'.format(qb.urlencode(), i))
            else:
                page_list.append('<li><a href="?{}">{}</a></li>'.format(qb.urlencode(), i))

        if page == total_sum:  # 右边箭头
            page_list.append(
                '<li class="disabled"><span aria-hidden="true">&raquo;</span></li>')
        else:
            qb["page"] = page + 1
            page_list.append(
                '<li><a href="?{}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>'.format(
                    qb.urlencode()))
        page_list.append('</ul></nav>')
        self.page_html = "".join(page_list)

        self.start = (page - 1) * max_show  # 切片起始 0 10
        self.end = page * max_show  # 切片结束 10 20
